package cn.com.zero.job.core;


import cn.com.zero.job.enums.BlockStrategyEnum;
import cn.com.zero.job.enums.MisfireStrategyEnum;
import cn.com.zero.job.enums.RouteStrategyEnum;
import cn.com.zero.job.enums.ScheduleTypeEnum;
import cn.com.zero.job.model.XxlJobInfo;
import cn.hutool.core.util.StrUtil;
import com.xxl.job.core.handler.IJobHandler;

/**
 * @author zhoupeng
 * @version 1.0.0
 * @Description Job 父类
 * @createTime 2022-07-14
 */
public abstract class ZeroJob extends IJobHandler {

    /**
     * 版本号，如果任务发生变动，增加版本号会自动同步到任务调度中心
     */
    public abstract int version();

    /**
     * 任务名称
     */
    public abstract String name();


    /**
     * 是否自动启动
     */
    public abstract boolean autoStart();

    /**
     * 调度配置，如果 type 是固定速度，需要配置间隔时间，单位为秒，如果是 type 是 CRON，则配置 CRON 表达式
     */
    public abstract String config();
    /**
     * 任务参数
     */
    public String params() {
        return null;
    }

    /**
     * 报警邮件，多个以逗号分割，需要在 xxl-job-admin 配置邮箱参数后才有效
     */
    public String mail() {
        return null;
    }

    /**
     * 调度类型，默认是固定速度
     */
    public ScheduleTypeEnum type() {
        return ScheduleTypeEnum.FIX_RATE;
    }

    /**
     * 路由策略
     */
    public RouteStrategyEnum routeStrategy() {
        return RouteStrategyEnum.FIRST;
    }

    /**
     * 调度过期策略
     */
    public MisfireStrategyEnum misfireStrategy() {
        return MisfireStrategyEnum.DO_NOTHING;
    }

    /**
     * 阻塞策略
     */
    public BlockStrategyEnum blockStrategy() {
        return BlockStrategyEnum.SERIAL_EXECUTION;
    }


    /**
     * 任务超时时间(秒)，大于0时生效
     */
    public int timeout() {
        return 0;
    }

    /**
     * 失败重试次数
     */
    public int retryCount() {
        return 0;
    }


    public XxlJobInfo getXxlInfo(String appName){
        XxlJobInfo xxlJobInfo = new XxlJobInfo();
        xxlJobInfo.setJobDesc(getHandlerName(appName));
        xxlJobInfo.setAuthor(appName);
        xxlJobInfo.setAlarmEmail(StrUtil.nullToEmpty(mail()));
        xxlJobInfo.setScheduleType(type().getTitle());
        xxlJobInfo.setScheduleConf(config());
        xxlJobInfo.setMisfireStrategy(misfireStrategy().getTitle());
        xxlJobInfo.setExecutorRouteStrategy(routeStrategy().getTitle());
        xxlJobInfo.setExecutorHandler(getHandlerName(appName));
        xxlJobInfo.setExecutorParam(StrUtil.nullToEmpty(params()));
        xxlJobInfo.setExecutorBlockStrategy(blockStrategy().getTitle());
        xxlJobInfo.setExecutorTimeout(timeout());
        xxlJobInfo.setExecutorFailRetryCount(retryCount());
        xxlJobInfo.setTriggerStatus(autoStart() ? XxlJobInfo.STATUS_START : XxlJobInfo.STATUS_STOP);
        xxlJobInfo.setGlueType("BEAN");
        xxlJobInfo.setGlueRemark("");
        xxlJobInfo.setGlueSource("");
        xxlJobInfo.setChildJobId("");
        return xxlJobInfo;
    }

    public String getHandlerName(String appName){
        return StrUtil.format("{}.{}",appName,name());
    }
}
